-
Notifications
You must be signed in to change notification settings - Fork 73
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
BIP-34: Sunrise Improvements #337
Merged
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sun incentive
This reverts commit 1237fe0. No idea what I did tbh, gonna revert
Initialize Foundry for testing and scripting
publiuss
reviewed
Mar 31, 2023
publiuss
reviewed
Apr 3, 2023
…Beanstalk into bip-sunrise-improvements
- updated natspec on siloFacet (specifying deposits are erc20) - general comments justifying why we omit safemath/safecast - cosmetic variable name changes
Brean0
approved these changes
Apr 5, 2023
publiuss
approved these changes
Apr 6, 2023
publiuss
force-pushed
the
bip-sunrise-improvements
branch
from
April 26, 2023 02:09
2f964a8
to
a6e2c1c
Compare
hellofromguy
approved these changes
May 4, 2023
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Labels
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
BIP-34: Sunrise Improvements
Proposer
Beanstalk Farms, Chaikitty
Proposer Wallet: 0xf9d183af486a973b7921ceb5fdc9908d12aab440
Summary
sunrise
;sunrise
incentive reward to account for current network and Beanstalk conditions; andsunrise
interoperable with thefarm
function.Links
Problem
During times of short-term excess demand for Soil, Beanstalk is paying significantly more in Pods than is necessary to attract creditors. In addition, Pod minting is concentrated towards Farmers who are able to execute transactions on-chain first when the demand for Soil is excessively high.
Beanstalk frequently overpays for the
sunrise
, as most of the reward is used to pay for high gas prices that are due to the competitiveness of callingsunrise
.The
sunrise
function is not interoperable with thefarm
function, as the function does not currently return any data.Proposed Solution
Morning Auction
We propose a Dutch auction for Temperature in the Field during the first$b$ blocks after the
sunrise
(Morning) of each Season. Each Morning, the Temperature ramps from 1% to 100% of the maximum Temperature.With this change, the Temperature offered by Beanstalk is dynamic within a Season. In practice, when
deltaB > 0
, the amount of Soil issued in a Season is dynamic, while the maximum number Pods that can be issued if all Soil is Sown in the Morning is fixed. WhendeltaB < 0
, the amount of Soil issued in a Season is fixed, while the maximum number of Pods that can be issued if all Soil is Sown in the Morning is dynamic.Before Morning Auction
deltaB > 0
deltaB < 0
*If all Soil is Sown.
Morning Auction
deltaB > 0
deltaB < 0
**If all Soil is Sown in the Morning.
Specification
Redefine all instances of$h_t$ as the maximum Temperature $h_t^{\text{max}}$ .
Redefine$h$ to:
Where$a$ is the control variable, $b$ is the number of blocks needed to elapse to reach the maximum Temperature, and $c$ is the number of blocks that have elapsed since the
sunrise
call.Adjust the time in which Beanstalk considers demand for Soil increasing in instances where all but at most one Soil is Sown from 5 minutes to 10 minutes since$\Delta{E_{t-1}^{u^{first}}} \leq 600$ ).
sunrise
(i.e.,When
deltaB > 0
, fix the maximum Pods that can be issued during a Season based on the number of Pods that became Harvestable at the start of that Season.Due to function changes in
LibDibbler.sol
, the Fundraiser Facet must also be updated.Storage
The following changes are made to Beanstalk's storage:
Season
struct:uint32 sunriseBlock
;Season
struct:bool abovePeg
;startSoil
from theField
struct in favor ofbeanSown
;soil
in theField
struct from datatypeuint256
touint128
; andyield
from theWeather
struct in favor oft
.Sunrise Incentive Adjustment
We propose changing the base
sunrise
incentive reward to account for current network and Beanstalk conditions.The following logic is used to calculate the incentive reward:
Where:
deltaGas
is equal to the delta ofgasleft
at the start and end of transaction;GAS_OVERHEAD
is the estimated gas overhead not included indeltaGas
(21k plus gas cost to pay the caller);MAX_SUNRISE_GAS
is the manipulation protection parameter that defines the maximum possible gas cost to callsunrise
(likely during a Flood);PRIORITY_FEE_BUFFER
is the overestimation of the maximum requiredpriorityFee
to callsunrise
(it is possible to access thebaseGasFee
but not thepriorityFee
in Solidity);ethBeanPrice
is the ETH/BEAN price (which is derived from the BEAN:3CRV pool on Curve and the USDC:ETH pool on Uniswap V3);BASE_REWARD
is a fixed increase in Bean reward to cover the costs of operatingsunrise
bots;MAX_REWARD
is the max base reward to prevent manipulation;blocksLate
is the number of blocks in which a successfulsunrise
call was executed past the first block in which it could have been executed; andBLOCK_LENGTH_SECONDS
is number of seconds per block in Ethereum (post-Merge this is fixed at 12).gm
functionWe propose adding a
gm
function that (1) implements thesunrise
function, (2) can send the incentive reward to the caller's Farm or Circulating balance and (3) returns the number of Beans paid for the incentive reward.Technical Rationale
The cost to execute
sunrise
in Beans is:This solution computes an on-chain estimation of the above formula while adding sufficiently tunable parameters to properly account for estimation error and potential manipulation.
Adding the ability to send
sunrise
incentive rewards to the caller's Farm balance increases the composability of Beanstalk. Adding a return value for the newgm
function makes it much easier for other smart contracts calling Beanstalk to tracksunrise
incentive rewards.Economic Rationale
Reducing unnecessary Pod issuance should improve Beanstalk's creditworthiness as a borrower. Maximizing Beans borrowed for a given Pod issuance should improve Beanstalk's efficiency.
Reducing unnecessary Bean issuance in the
sunrise
incentive reward can reduce sell pressure on Beans.The cost of paying the
sunrise
caller differs based on the selectedToMode
and whether the caller already has Beans in their Circulating and/or Farm balance.GAS_OVERHEAD
is set such that the incentive amount is high enough for Farmers that don't have Beans in their balances already. For Farmers that already have Beans (outside the Silo), this also has the affect of compensating for one failed transaction per success, such that a caller with 50/50 success rate will retain slight profit.Improving the composability of Beanstalk should improve the user experience and utility of Beanstalk and Beans.
Contract Changes
Field Facet
The following
FieldFacet
is being removed from Beanstalk:0x79801f5cb2592dd2173482198385e62870a0eae2
The following
FieldFacet
is being added to Beanstalk:0xB57A1c006D827af549F6A31DC10028e5e2782762
FieldFacet
Function Changessow
0x6c8d548e
sowWithMin
0x78309c85
harvest
0x8fd83ecf
harvestableIndex
0xd6be1816
plot
0xe1d9d628
podIndex
0xcb44a6cf
totalHarvestable
0x067fcd2e
totalHarvested
0x23dc1142
totalPods
0xc0aa6a90
totalSoil
0x3285008a
totalUnharvestable
0x4433366d
yield
0x28593984
maxTemperature
0x7907091f
remainingPods
0x56ba3e24
sow
0x32ab68ce
sowWithMin
0x553030d0
temperature
0xadccea12
FieldFacet
Event ChangesNone.
Fundraiser Facet
The following
FundraiserFacet
is being removed from Beanstalk:0x538c76976ef45b8ca5c12662a86034434bfc7a8e
The following
FundraiserFacet
is being added to Beanstalk:0xBb5dC125E48A4580721b1E40Ac52984c2Ce54D3A
FundraiserFacet
Function ChangescreateFundraiser
0x4b4e8d9a
fund
0x43c5198e
fundingToken
0xc869c1eb
fundraiser
0xce133450
numberOfFundraisers
0x6299a9af
remainingFunding
0x0d1a844c
totalFunding
0x6ee66ddf
FundraiserFacet
Event ChangesNone.
Season Facet
The following
SeasonFacet
is being removed from Beanstalk:0x83d6e6b446613c9bfaebc64260962bc4f828a3ac
The following
SeasonFacet
is being added to Beanstalk:0x9c9360C85cd020D4eF38775F6ADEdD38931f1731
SeasonFacet
Function Changespaused
0x5c975abb
plentyPerRoot
0xe60d7a83
poolDeltaB
0x471bcdbe
rain
0x43def26e
season
0xc50b0fb0
seasonTime
0xca7b7d7b
sunrise
0xfc06d2a6
time
0x16ada547
totalDeltaB
0x06c499d8
weather
0x686b6159
abovePeg
0x2a27c499
gm
0x64ee4b80
sunriseBlock
0x3b2ecb70
SeasonFacet
Event ChangesNone.
Initialization Contract
The
init
function on the followingInitBipSunriseImprovements
contract is called:0xA3b3fB1951872346ea45EE601B29637Ca67fe6B4
Beans Minted
None.
Audit
The commit hash of this BIP is 538b7a2a89760f6e7aab0fa3146551c030f388d1.
Halborn has performed an audit of this BIP up to commit hash f37cb42809fb8dfc9a0f2891db1ad96a1b848a4c. You can view the Halborn audit report here. All changes made between the two commits were either tests, documentation or minor fixes found during code review.
Effective
Immediately upon commit.